約 2,416,889 件
https://w.atwiki.jp/bambooflow/pages/126.html
Visual C++ 2008 Express EditionへのSystemCライブラリ インストール Windows XPでのVisual C++ 2008 Expres EditionへのSystemCインストールをしてみた。 プロジェクトファイルは(バージョンは違うが)すでに用意されているのでそれを使う。 Visual C++ 2008 Express EditionへのSystemCライブラリ インストールSystemC2.2インストールフォルダ展開 プロジェクトファイル実行 プロジェクトファイルの設定・確認 コンパイル(ビルド) インストール 設定のまとめ SystemC2.2インストール フォルダ展開 C \にsystemc-2.2.0フォルダを展開。 プロジェクトファイル実行 C \systemc-2.2.0\mscv71\SystemCフォルダへ移動して、SystemC.vcprjをダブルクリック。 変換ウィザードが実行されるので、次へをクリック。 変換前にバックアップを作成するで、次へをクリック。 完了をクリック。 閉じるをクリック。 準備完了。 プロジェクトファイルの設定・確認 メニューのプロジェクトからプロパティを選択。 全般、構成の種類が"スタティック ライブラリ(.lib)"であることを確認。 出力ディレクトリ、中間ディレクトリは"Debug"であることを確認。 デバッグ、特に設定無し。 C/C++の全般、追加インクルードディレクトリの設定が"../../src"となっていることを確認。 64ビット移植への対応は"いいえ"であることを確認。 C/C++の最適化、特に設定無し。 最適化は今回、"無効(/Od)"としたが、最適化してもよい。 C/C++のプリプロセッサ、プロセッサの定義で"WIN32;_DEBUG;_LIB;SC_INCLUDE_FX"となっていることを確認。 C/C++のコード生成、簡易リビルドを行うは"いいえ"を選択。 ランタイムライブラリは"マルチスレッド デバッグ(/MTd)"であることを確認。 C/C++の言語、ランタイム型情報を有効にするは"はい"であることを確認。 C/C++のプリコンパイル済みヘッダー、プリコンパイル済みヘッダの作成/使用は"プリコンパイル済みヘッダーを使用しない"であることを確認。 C/C++の出力ファイル、特に設定無し。 C/C++のブラウザ情報、特に設定無し。 C/C++の詳細、指定の警告を無効にするは、"4224;4996"と変更。(しなくてもコンパイルはできるが警告メッセージがうるさい) C/C++のコマンド ライン、設定が正しいかどうか、もう一度確認。 ライブラリアンの全般、出力ファイルが"$(OutDir)/SystemC.lib"となっていることを確認。 コンパイル(ビルド) メニューのビルドからソリューションのビルドを選択して、コンパイル開始。( F7 でもOK) コンパイルが正常に終了したことを確認。 C \systemc-2.2.0\mvc71\SystemC\Debugフォルダ下にSystemC.libが生成されていることを確認。 これで、コンパイル完了。 今回は、とりあえずSystemCが実行できればいいかな程度の設定。 最適化とかはおこのみで。 インストール 設定のまとめ 以下のプロパティ設定を確認する。 全般、構成の種類が"スタティック ライブラリ(.lib)"であることを確認。 出力ディレクトリ、中間ディレクトリは"Debug"であることを確認。 C/C++の全般、追加インクルードディレクトリの設定が"../../src"となっていることを確認。 C/C++のプリプロセッサ、プロセッサの定義で"WIN32;_DEBUG;_LIB;SC_INCLUDE_FX"となっていることを確認。 C/C++のコード生成、簡易リビルドを行うは"いいえ"を選択。 C/C++のコード生成、ランタイムライブラリは"マルチスレッド デバッグ(/MTd)"であることを確認。 C/C++の言語、ランタイム型情報を有効にするは"はい"であることを確認。 C/C++の詳細、指定の警告を無効にするは、"4224;4996"と変更。(しなくてもコンパイルはできるが警告メッセージがうるさい) ライブラリアンの全般、出力ファイルが"$(OutDir)/SystemC.lib"となっていることを確認。 テストプログラム、HelloWorldのコンパイル・実行へ
https://w.atwiki.jp/bambooflow/pages/144.html
コアとなる言語クラス定義 コアとなる言語クラス定義ヘッダファイル コアクラス一覧 用意されたチャネルクラス定義チャネルクラス一覧 チャネル接続の対応表 ヘッダファイル SystemCを使うには次のヘッダファイルをインクルードする。 #include "systemc.h" #include "systemc.h" #include "systemc" #include "systemc" using sc_core sc_module; using sc_core sc_signal; using sc_core SC_NS; using sc_core sc_start; using sc_dt sc_logic; #include iostream using std ofstream; using std cout; using std endl; コアクラス一覧 sc_module sc_module_name sc_sensitive sc_spawn_optionsとsc_spawn sc_process_handle sc_event_finderとsc_event_finder_t sc_event_and_listとsc_event_or_list sc_evnet sc_time sc_port sc_export sc_interface sc_prim_channel sc_object sc_attr_base sc_attribute sc_attr_cltn 用意されたチャネルクラス定義 チャネルクラス一覧 sc_signal_in_if sc_signal_in_if<bool>とsc_signal_in_if<sc_dt sc_logic> sc_signal_inout_if sc_signal sc_signal<bool>とsc_signal<sc_dt sc_logic> sc_buffer sc_clock sc_in sc_in<bool>とsc_in<sc_dt logic> sc_inout sc_inout<bool>とsc_inout<sc_dt sc_logic> sc_out sc_signal_resolved sc_in_resolved sc_sc_inout_resolved sc_out_resolved sc_signal_rv sc_in_rv sc_inout_rv sc_out_rv sc_fifo_in_if sc_fifo_out_if sc_fifo sc_fifo_in sc_fifo_out sc_mutex_if sc_mutex sc_semaphore_if sc_semaphore sc_event_queue チャネル接続の対応表 入力 チャネル 出力 sc_port sc_signal_in_if X sc_signal X sc_buffer X sc_port sc_signal_out_if X sc_port sc_signal_inout_if X sc_port sc_signal_inout_if X sc_in X sc_out X sc_inout X sc_inout X sc_in bool sc_clock sc_in_resolved sc_signal_resolved sc_out_resolved sc_inout_resolved sc_inout_resolved sc_in_rv W sc_signal_rv W sc_out_rv W sc_inout_rv W sc_inout_rv W sc_port sc_fifo_in_if X sc_fifo X sc_port sc_fifo_out_if X sc_fifo_in X sc_fifo_out X X 型(bool,unsigned char,int,sc_uint , sc_int , etc.) W ビット幅 アクセス チャネル sc_port sc_mutex_if sc_mutex sc_port sc_semaphore_if sc_semaphore
https://w.atwiki.jp/bambooflow/pages/140.html
SystemC 動的プロセスについて メソッドを動的にSC_METHODやSC_THREAD指定することが可能。 普通のモデリング時には必要ないが、応用的なことに使用することがある。 たとえば、デバッグ機能を追加したい、とか、検証機能を強化したい、とか。 以下にその方法をメモる。 SystemC 動的プロセスについて動的プロセスを扱うための準備 使用する関数 動的methodを指定する記述例 動的threadを指定する記述例 動的プロセスを扱うための準備 以下のようにsytemc.hをインクルードする前にSC_INCLUDE_DYNAMIC_PROCESSESを定義する必要がある。 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h もしくは、コンパイルオプションの "-D"を使用する方法もある。 g++ -I/usr/local/systemc-2.2 -DSC_INCLUDE_DYNAMIC_PROCESSES -c model.cpp 使用する関数 sc_spawn プロセスを指定するときに使用する。 sc_bind プロセスとする関数を指定するときに使用する。 sc_bindはboost bindのdefine定義。 sc_spawn_options プロセスのオプション設定をする。たとえば、センシティブ指定とか。 戻り値なしで登録する場合 sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 戻り値ありで登録する場合 sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 動的methodを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in sc_uint 8 din1; sc_in sc_uint 8 din2; sc_out sc_uint 9 dout; SC_CTOR( DUT ) { SC_THREAD( init_thread ); } void init_thread() { sc_spawn_options mth; mth.spawn_method(); mth.dont_initialize(); mth.set_sensitivity( din1 ); mth.set_sensitivity( din2 ); sc_spawn( sc_bind( DUT spawn_method0,this), "method0", mth ); } void spawn_method0() { dout.write( din1.read() + din2.read() ); } }; 注意として、sc_spawnの指定は、プロセス内に記述する。 コンストラクタに記述すると実行時エラーとなる。 動的threadを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in bool clk; SC_CTOR( DUT ) { SC_THREAD( run ); } void run() { sc_spawn_options opt; opt.set_sensitivity( clk.pos() ); sc_spawn( sc_bind( DUT spawn_thread,this, false ), "thread0", opt ); } void spawn_thread( bool flag ) { while (true) { ・・・ wait(); } } }; 動的プロセスでは引数を渡したり戻り値を受け取ったりするができる。 例では、bool型の引数を渡している。
https://w.atwiki.jp/bambooflow/pages/134.html
SystemC HelloWorld - 始めの一歩 SystemCライブラリのインストールが完了したら、とりあえず実行できるか確認してみる。 「Hello, SystemC!!!」を表示するプログラム。 ここでは、Linuxインストールで/user/local/systemc-2.2/にインストールしたとする。 SystemC HelloWorld - 始めの一歩プログラム内容 サンプル コンパイル/実行 まとめ プログラム内容 main.cpp #include systemc.h int sc_main( int argc, char* argv[] ) { cout "Hello, SystemC!!!" endl; return 0; } "systemc.h"のインクルードする メインは"sc_main"を使用する sc_mainはSystemCのメイン関数となっている。実際のc++のメイン関数であるmainはライブラリ内に存在する。main関数はsc_main.cppに存在する。ここで、sc_elab_and_simが呼ばれて、その中で、sc_mainが実行される。実行したときに最初にSystemCのバージョン等が表示される。これはsc_elab_and_sim内でplnにより表示されている。 SystemCのバージョンv2.2では、インクルードで".h"を抜いた書き方ができる。 その場合は以下のようになる。 #include systemc using namespace sc_core; using namespace sc_dt; using namespace std; サンプル hello.tgz main.cpp Makefile コンパイル/実行 $ make g++ -Wall -I. -I/usr/local/systemc-2.2/include -c main.cpp g++ -Wall -I. -I/usr/local/systemc-2.2/include -L. -L/usr/local/systemc-2.2/lib-linux -o run.x main.o -lsystemc -lm $ ./run.x 結果表示 SystemC 2.2.0 --- Jun 28 2008 10 19 12 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED Hello, SystemC!!! まとめ ここでは、SystemCのインストールがうまくいったかどうかとコンパイルが正しくできるかを確認した。 SystemCを理解するためには次を覚える。 モジュール定義方法 信号の定義と接続方法 プロセス(並列処理)の定義方法 スレッド間の同期について システム時間とシミュレーション時間について シミュレーションの開始と終了
https://w.atwiki.jp/bambooflow/pages/136.html
SystemC 並列処理動作について ここでは、SystemCの機能のひとつである並列処理動作について説明する。 2つのプロセスを作り、並列動作を体感してみる。 SystemC 並列処理動作についてサンプル プログラム 実行結果 説明 サンプル multi_process.tgz main.cpp Makefile プログラム main.cpp #include systemc.h SC_MODULE( MyModel ) { // constructor SC_CTOR( MyModel ) { SC_THREAD( thread0 ); SC_THREAD( thread1 ); } // process0 void thread0() { while (true) { cout "----thread0----------" endl; wait( 10.0, SC_US ); } } // process1 void thread1() { while (true) { cout "-----------thread1---" endl; wait( 10.0, SC_US ); } } }; int sc_main( int argc, char* argv[] ) { MyModel *myModel; // module instance myModel = new MyModel( "MyModel" ); sc_assert( myModel ); ///////////////////////////////////////////////////////////////////////// // initialize sc_start( SC_ZERO_TIME ); cout "now time is " sc_time_stamp() endl; // simulation sc_start( 10.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 10.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 100.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 50.0, SC_US ); cout "now time is " sc_time_stamp() endl; ///////////////////////////////////////////////////////////////////////// delete myModel; return 0; } 実行結果 SystemC 2.2.0 --- Jul 1 2008 00 09 35 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED ----thread0---------- -----------thread1--- now time is 0 s now time is 10 us ----thread0---------- -----------thread1--- now time is 20 us -----------thread1--- ----thread0---------- -----------thread1--- ・・・ ----thread0---------- -----------thread1--- ----thread0---------- now time is 120 us ----thread0---------- -----------thread1--- ----thread0---------- ・・・ -----------thread1--- ----thread0---------- -----------thread1--- now time is 170 us 説明 このプログラムではMyModelというSC_MODULEを1つ定義してsc_main()でインスタンスしている。 このMyModelは2つのプロセスをもつ。プロセス名は、thread0とthread1。 この2つのプロセスは、シミュレーション開始(sc_start)とともに実行される。 ここで、注目してほしいことは、thread0とthread1はどちらもwhile(true){}の無限ループを構成していること。 SC_THREADの処理はwaitによりいったん停止することができる。 wait( 10.0, SC_US ); この記述は、ここで処理を一端停止し、シミュレーション時間が10us進んだらこのwaitを抜けて続きの処理をするものである。第1引数はdouble型、第2引数は時間の単位を指定する。 時間の単位はSC_SEC(秒)からSC_FS(フェムト秒)まで指定できる。 今回は、SC_US(マイクロ秒)を単位として指定した。 thread0とthread1のwaitの時間はともに10usなのでどちらの処理が先に実行されるかはわからない。 どちらが先に処理されるかの順番はSystemCでは保証されない。 実行結果をみるとsc_start()を実行するたびにthread0とthread1の実行の順番が入れ替わっていることに注目してほしい。 プロセスは、posixもしくはpthreadというCライブラリのスレッド・モデルを利用して実現しているようだ。
https://w.atwiki.jp/bambooflow/pages/121.html
SystemCの抽象度(抽象レベル) SystemCの抽象度(抽象レベル)TLM標準化団体ごとの抽象レベル定義OSCIが提唱する抽象レベル OCP-IPが提唱する抽象レベル GreenSocsが提唱する抽象レベル STARCが提唱する抽象レベル その他の抽象レベル TLM標準化団体ごとの抽象レベル定義 OSCIが提唱する抽象レベル PV(Programmers View) PVT(Programmers View with Timing) CC(Cycle Callable) OCP-IPが提唱する抽象レベル OCP/TL3(OCP Transaction Level 3) OCP/TL2(OCP Transaction Level 2) OCP/TL1(OCP Transaction Level 1) OCP/TL0(OCP Transaction Level 0) GreenSocsが提唱する抽象レベル PV(Programmers View) PVT(Programmers View with Timing) CC(Cycle Callable) RTL(Register Transfer Level) STARCが提唱する抽象レベル UTTR(Un-timed Transaction) ATTR(Approximately-timed Transaction) ATBP(Approxymately-timed Bus-Phase) CABC(Cycle-accurate Bus-Cycle) CABS(Cycle-accurate Bus-Signal) データの粒度とタイミング精度から抽象レベルを分類する。 その他の抽象レベル UTF(Untimed Functional)モデル TF(Timed Functional)モデル BCA(Bus Cycle Accurate)モデル CA(Cycle Accurate)モデル
https://w.atwiki.jp/bambooflow/pages/132.html
SystemC Visual C++ Express Edition Visual C++ Express Editionでの実行の仕方とかをここにメモ書きとしてまとめる。 HelloWorldインストール
https://w.atwiki.jp/bambooflow/pages/128.html
SystemC プロセスについて SystemC プロセスについてプロセスとは プロセスの種類SC_METHOD SC_THREAD SC_CTHREAD プロセスとは プロセスはプログラムが並列動作するための機構の1つ。 シミュレーションが開始されると、プロセスとして指定された関数(プロセス関数)が実行される。 プロセス関数は1つのモジュールに複数存在することも許される。 ソフトウェアの場合、プログラムは上から順に逐次実行の動作となるが、ハードウェアの場合には並列動作となるため、ピュアなCやC++ではハードウェアを表現するには難がある。並列動作を可能賭したのがSystemCであり、プロセスはSystemCの特徴の1つとなっている。 プロセスは、Verilog-HDLでいうところのinitial文やalways文に該当する。 プロセスの種類 次の3つが存在する。 SC_METHOD SC_THREAD SC_CTHREAD それぞれマクロとなっているが、詳しい説明はしない。 SC_METHOD Verilog-HDLのalways文に似ている。 センシティビティ・リストの記述が必要。 シミュレーション中、何度でも呼び出される。 プロセス内にwait記述することはできない。 プロセス内に無限ループを構成してはならない。 このプロセスでは機能記述することは少ない。 RTL記述の表現に使用したり、信号の受渡しのタイミング調整に使う程度。 構文 void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_METHOD( process_func ); RTL組合せ回路記述例 SC_MODULE( MOD ) { sc_in sc_uint 8 in_a; sc_in sc_uint 8 in_b; sc_out sc_uint 9 out; SC_CTOR( MOD ) { SC_METHOD( adder_method ); sensitive in_a in_b; } void adder_method() { out.write( in_a.read() + in_b.read() ); } RTLのF/F回路生成 sc_in_clk Clk; sc_in bool ResetN; sc_in sc_uint 8 a; sc_in sc_uint 8 b; sc_in sc_uint 8 z; SC_CTOR( MOD ) { SC_METHOD( method0 ); sensitive Clk.pos() ResetN.neg(); } void method0() { if (!ResetN.read()) { z.write( 0 ); // リセット記述 } else { z.write( a.read() + b.read() ); } } SC_THREAD Verilog-HDLのinitial文に似ている。 シミュレーション開始時の1度だけ呼び出される。プロセスの実行が終了してしまうと再度呼ばれることはないため、通常はwhile(true){}を使って無限ループを構成してその中に機能記述する。 センシティビティ・リストの記述が可能。センシティビティ・リストはなくてもよい。 このプロセスを使用して機能記述することが多い。 3つのプロセスの中で、もっともアルゴリズムを記述するのに敵している。 構文 void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_THREAD( process_func ); 記述例 SC_CTOR( ) { SC_THREAD( main_thread ); } void main_thread() { while (true) { // ここに機能を記述 wait( event ); } } SC_CTHREAD SC_THREADに似ているが、クロック動作の記述専用のTHREADである。 センシティビティ・リストは持たない。 wait記述はクロック・イベントを待つ動作となる。 reset_signal_isによりリセット動作が記述可能。 SC_THREADに比べてシミュレーション速度が遅くなる。 構文 sc_in_clk CLK; // クロック信号(sc_clockとつなぐ) void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_CTHREAD( process_func, clk.pos() ); 記述例 sc_in_clk CLK; sc_in bool RESET_N; SC_CTOR( ) { SC_CTHREAD( main_thread, CLK.pos() ); reset_signal_is( RESET_N, false ); } void main_thread() { // ここにリセット動作を書く wait(); while (true) { // ここに機能を記述 wait(); } }
https://w.atwiki.jp/bambooflow/pages/116.html
SystemCのエラボレーション・フェーズ SystemCのエラボレーション・フェーズ説明 実験 説明 エラボレーション・フェーズは、シミュレーション開始前のフェーズ。 ここでは、つぎの作業をしている データ構造の初期化 接続関係の構築もし、sc_in 、sc_out 等が接続されていない場合エラーを出力する 次の実行フェーズの前処理(end_of_elaboration) SystemCでは3つのフェーズが存在する。 エラボレーション・フェーズ 実行フェーズ クリーンアップ・フェーズ sc_start()が実行されると、まずエラボレーション・フェーズにはいる。 シミュレーションは実行フェーズである。 sc_start()から抜けるとクリーンアップ・フェーズにはいる。 sc_moduleには、次の4つのvirtual関数が存在する。 before_end_of_elaboration end_of_elaboration start_of_simulation end_of_simulation どのような順番で呼ばれるのか気になったので実験してみた。 実験 main.cpp #include systemc.h #include "mod.h" int sc_main( int argc, char* argv[] ) { MOD *mod; printf("main begin\n"); mod = new MOD( "mod" ); printf( "main exec sc_start\n" ); sc_start( -1 ); printf( "main end\n" ); return 0; } MOD.h #ifndef __MOD_H #define __MOD_H #include systemc.h SC_MODULE( MOD ) { SC_CTOR( MOD ) { printf( "mod constructor\n" ); SC_THREAD( thread_proc ); } ~MOD() { printf( "mod destructor\n" ); } void thread_proc() { printf( "mod exec sc_stop\n" ); sc_stop(); } void before_end_of_elaboration() { printf( "mod before_end_of_elaboration\n" ); } void end_of_elaboration() { printf( "mod end_of_elaboration\n" ); } void start_of_simulation() { printf( "mod start_of_simulation\n" ); } void end_of_simulation() { printf( "mod end_of_simulation\n" ); } }; #endif /* __MOD_H */ 実行結果 main begin mod consructor main exec sc_start mod before_end_of_elaboration mod end_of_elaboration mod start_of_simulation mod exec sc_stop SystemC simulation stopped by user. mod end_of_simulation main end sc_startが実行されると before_end_of_elaboration() エラボレーション実行 end_of_elaboration() start_of_simulation() シミュレーション開始 という順番で関数が呼ばれる。 sc_stopが実行されると end_of_simulation が実行され、sc_start()内の無限ループから抜けてsc_mainへ戻る。
https://w.atwiki.jp/bambooflow/pages/169.html
インドのCircuitSutra、STARC「TLモデリングガイド」準拠のデモモデルをWebで公開、したらしい -- (管理者) 2009-04-23 06 46 46 OSCI TLM 2.0のSystemC TLMキットを米OCP-IPが提供開始、らしい -- (管理者) 2009-05-05 08 40 52 OSCI本家に”TLM-2.0 in Action”がアップされた。 -- (管理者) 2009-05-07 23 46 46 Cadence IES8.2がTLM2.0に対応。 -- (管理者) 2009-05-28 07 16 19 SystemC Japan 2009は2009年7月10日。 -- (管理者) 2009-05-28 07 17 30